W pierwszym kroku, za pomocą biblioteki pandas, wczytano dane z pliku CSV do struktury danych DataFrame. Funkcja load_csv(file_name) została zaimplementowana w celu wczytania danych z pliku o podanej nazwie.
#Loading Data
import os
import pandas as pd
def load_csv(file_name):
current_dir = os.getcwd()
file_path = os.path.join(current_dir, file_name)
df = pd.read_csv(file_path)
return df
# Replace 'Global_Country_Information_Dataset_2023.csv' with your actual .csv file name
df = load_csv('world-data-2023.csv')
df
| Country | Density\n(P/Km2) | Abbreviation | Agricultural Land( %) | Land Area(Km2) | Armed Forces size | Birth Rate | Calling Code | Capital/Major City | Co2-Emissions | ... | Out of pocket health expenditure | Physicians per thousand | Population | Population: Labor force participation (%) | Tax revenue (%) | Total tax rate | Unemployment rate | Urban_population | Latitude | Longitude | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Afghanistan | 60 | AF | 58.10% | 652,230 | 323,000 | 32.49 | 93.0 | Kabul | 8,672 | ... | 78.40% | 0.28 | 38,041,754 | 48.90% | 9.30% | 71.40% | 11.12% | 9,797,273 | 33.939110 | 67.709953 |
| 1 | Albania | 105 | AL | 43.10% | 28,748 | 9,000 | 11.78 | 355.0 | Tirana | 4,536 | ... | 56.90% | 1.20 | 2,854,191 | 55.70% | 18.60% | 36.60% | 12.33% | 1,747,593 | 41.153332 | 20.168331 |
| 2 | Algeria | 18 | DZ | 17.40% | 2,381,741 | 317,000 | 24.28 | 213.0 | Algiers | 150,006 | ... | 28.10% | 1.72 | 43,053,054 | 41.20% | 37.20% | 66.10% | 11.70% | 31,510,100 | 28.033886 | 1.659626 |
| 3 | Andorra | 164 | AD | 40.00% | 468 | NaN | 7.20 | 376.0 | Andorra la Vella | 469 | ... | 36.40% | 3.33 | 77,142 | NaN | NaN | NaN | NaN | 67,873 | 42.506285 | 1.521801 |
| 4 | Angola | 26 | AO | 47.50% | 1,246,700 | 117,000 | 40.73 | 244.0 | Luanda | 34,693 | ... | 33.40% | 0.21 | 31,825,295 | 77.50% | 9.20% | 49.10% | 6.89% | 21,061,025 | -11.202692 | 17.873887 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 190 | Venezuela | 32 | VE | 24.50% | 912,050 | 343,000 | 17.88 | 58.0 | Caracas | 164,175 | ... | 45.80% | 1.92 | 28,515,829 | 59.70% | NaN | 73.30% | 8.80% | 25,162,368 | 6.423750 | -66.589730 |
| 191 | Vietnam | 314 | VN | 39.30% | 331,210 | 522,000 | 16.75 | 84.0 | Hanoi | 192,668 | ... | 43.50% | 0.82 | 96,462,106 | 77.40% | 19.10% | 37.60% | 2.01% | 35,332,140 | 14.058324 | 108.277199 |
| 192 | Yemen | 56 | YE | 44.60% | 527,968 | 40,000 | 30.45 | 967.0 | Sanaa | 10,609 | ... | 81.00% | 0.31 | 29,161,922 | 38.00% | NaN | 26.60% | 12.91% | 10,869,523 | 15.552727 | 48.516388 |
| 193 | Zambia | 25 | ZM | 32.10% | 752,618 | 16,000 | 36.19 | 260.0 | Lusaka | 5,141 | ... | 27.50% | 1.19 | 17,861,030 | 74.60% | 16.20% | 15.60% | 11.43% | 7,871,713 | -13.133897 | 27.849332 |
| 194 | Zimbabwe | 38 | ZW | 41.90% | 390,757 | 51,000 | 30.68 | 263.0 | Harare | 10,983 | ... | 25.80% | 0.21 | 14,645,468 | 83.10% | 20.70% | 31.60% | 4.95% | 4,717,305 | -19.015438 | 29.154857 |
195 rows × 35 columns
W drugim kroku, po wczytaniu danych do DataFrame df, użyto funkcji df.info() do uzyskania podstawowych informacji na temat struktury i zawartości danych.
DataFrame df zawiera 195 wierszy, które zawierają informacje o różnych krajach. Każdy wiersz składa się z 35 kolumn.
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 195 entries, 0 to 194 Data columns (total 35 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Country 195 non-null object 1 Density (P/Km2) 195 non-null object 2 Abbreviation 193 non-null object 3 Agricultural Land( %) 188 non-null object 4 Land Area(Km2) 194 non-null object 5 Armed Forces size 171 non-null object 6 Birth Rate 189 non-null float64 7 Calling Code 194 non-null float64 8 Capital/Major City 195 non-null object 9 Co2-Emissions 188 non-null object 10 CPI 178 non-null object 11 CPI Change (%) 179 non-null object 12 Currency-Code 180 non-null object 13 Fertility Rate 188 non-null float64 14 Forested Area (%) 188 non-null object 15 Gasoline Price 175 non-null object 16 GDP 193 non-null object 17 Gross primary education enrollment (%) 188 non-null object 18 Gross tertiary education enrollment (%) 183 non-null object 19 Infant mortality 189 non-null float64 20 Largest city 189 non-null object 21 Life expectancy 187 non-null float64 22 Maternal mortality ratio 181 non-null float64 23 Minimum wage 150 non-null object 24 Official language 190 non-null object 25 Out of pocket health expenditure 188 non-null object 26 Physicians per thousand 188 non-null float64 27 Population 194 non-null object 28 Population: Labor force participation (%) 176 non-null object 29 Tax revenue (%) 169 non-null object 30 Total tax rate 183 non-null object 31 Unemployment rate 176 non-null object 32 Urban_population 190 non-null object 33 Latitude 194 non-null float64 34 Longitude 194 non-null float64 dtypes: float64(9), object(26) memory usage: 53.4+ KB
W trzecim kroku przeprowadzono przetwarzanie kolumn DataFrame df, które obejmuje m.in. usunięcie białych znaków z nazw kolumn i zmianę niektórych nazw w celu ujednolicenia ich formatu.
W pierwszej części kodu wykorzystano pętlę for wraz z funkcją strip() w celu usunięcia białych znaków (spacji, tabulacji itp.) z nazw wszystkich kolumn w DataFrame df. Operacja ta ma na celu zapobieganie problemom wynikającym z niezamierzonych białych znaków w nazwach kolumn, które mogłyby wpłynąć na poprawność przetwarzania danych.
Po przeprowadzeniu tych operacji, DataFrame df posiada kolumny o bardziej przejrzystych nazwach, co ułatwi dalszą analizę i manipulacje danymi.
for column in df.columns:
column.strip()
df.rename(columns={'Density\n(P/Km2)': 'Density',
'Agricultural Land( %)': 'Agricultural Land (%)',
'Urban_population': 'Urban population',
'Co2-Emissions': 'CO2 Emissions',
'Land Area(Km2)': 'Land Area'}, inplace=True)
df.columns
Index(['Country', 'Density', 'Abbreviation', 'Agricultural Land (%)',
'Land Area', 'Armed Forces size', 'Birth Rate', 'Calling Code',
'Capital/Major City', 'CO2 Emissions', 'CPI', 'CPI Change (%)',
'Currency-Code', 'Fertility Rate', 'Forested Area (%)',
'Gasoline Price', 'GDP', 'Gross primary education enrollment (%)',
'Gross tertiary education enrollment (%)', 'Infant mortality',
'Largest city', 'Life expectancy', 'Maternal mortality ratio',
'Minimum wage', 'Official language', 'Out of pocket health expenditure',
'Physicians per thousand', 'Population',
'Population: Labor force participation (%)', 'Tax revenue (%)',
'Total tax rate', 'Unemployment rate', 'Urban population', 'Latitude',
'Longitude'],
dtype='object')
W czwartym kroku przeprowadzono przetwarzanie danych liczbowych znajdujących się w kolumnach DataFrame df. Operacje te mają na celu skonwertowanie wartości liczbowych w odpowiednich kolumnach z typu object (ciągi znaków) na typ float (liczby zmiennoprzecinkowe) w celu umożliwienia wykonywania matematycznych operacji i analizy danych liczbowych.
Przed przetwarzaniem danych liczbowych utworzono listę numerical_columns, która zawiera nazwy kolumn, w których znajdują się wartości liczbowe.
Następnie, dla każdej kolumny z listy numerical_columns, przeprowadzono szereg operacji w celu przygotowania danych do konwersji na typ float:
str (ciąg znaków) za pomocą astype(str), aby umożliwić dalsze operacje na ciągach.str.replace(). To umożliwiło usunięcie formatowania, które mogłoby zakłócić konwersję na liczbę zmiennoprzecinkową.float za pomocą astype(float), co zapewniło, że wartości liczbowe zostały odpowiednio zinterpretowane jako liczby zmiennoprzecinkowe.Dzięki przetwarzaniu danych liczbowych DataFrame df został odpowiednio przygotowany do dalszej analizy. Wartości liczbowe w wybranych kolumnach zostały poprawnie skonwertowane na typ float, co pozwoli na wykonywanie różnych operacji matematycznych oraz analizę danych statystycznych w kolejnych etapach projektu.
numerical_columns = [
'Density', 'Agricultural Land (%)', 'Land Area', 'Armed Forces size', 'Birth Rate',
'CO2 Emissions', 'CPI', 'CPI Change (%)', 'Fertility Rate', 'Forested Area (%)',
'Gasoline Price', 'GDP', 'Gross primary education enrollment (%)',
'Gross tertiary education enrollment (%)', 'Infant mortality', 'Life expectancy',
'Maternal mortality ratio', 'Minimum wage', 'Out of pocket health expenditure',
'Physicians per thousand', 'Population', 'Population: Labor force participation (%)',
'Tax revenue (%)', 'Total tax rate', 'Unemployment rate', 'Urban population', 'Latitude',
'Longitude'
]
for column in numerical_columns:
df[column] = df[column].astype(str)
df[column] = df[column].str.replace(",","").str.replace("$","").str.replace("%","")
df[column] = df[column].astype(float)
W piątym kroku przeprowadzono łączenie danych zawartych w DataFrame df z danymi o państwach i ich kodach ISO, które zostały wczytane z osobnego pliku CSV o nazwie 'country_codes.csv'. Celem tego kroku jest dodanie informacji o kodach ISO do głównego DataFrame df, co pozwoli na skojarzenie danych geograficznych z danymi liczbowymi i wizualizację na mapach w Plotly.
Przy użyciu funkcji load_csv('country_codes.csv') wczytano dane o państwach z kodami ISO do DataFrame df_codes. Ten osobny plik zawiera kolumny 'alpha-2' (kod ISO 2-cyfrowy), 'alpha-3' (kod ISO 3-cyfrowy), 'region' (region) i 'sub-region' (podregion).
W następnym kroku użyto funkcji pd.merge() w celu połączenia danych z DataFrame df z danymi z DataFrame df_codes. Do połączenia wykorzystano kolumnę 'Abbreviation' (skrótowa nazwa kraju) z DataFrame df oraz kolumnę 'alpha-2' z DataFrame df_codes. Operacja ta została wykonana z użyciem parametru how='inner', który oznacza, że zostaną zachowane tylko wiersze, które mają odpowiedniki w obu DataFrame'ach, eliminując tym samym państwa, dla których nie ma dostępnych kodów ISO.
DataFrame merged_df jest wynikiem łączenia danych z DataFrame df i DataFrame df_codes. Teraz w DataFrame merged_df znajdują się wszystkie informacje dotyczące państw, w tym dane liczbowe z DataFrame df oraz kody ISO (alpha-2 i alpha-3), region i podregion z DataFrame df_codes. Ten krok jest kluczowy dla stworzenia map w bibliotece Plotly, gdzie kod ISO pozwala na powiązanie danych liczbowych z odpowiednimi państwami na mapie.
df_codes = load_csv('country_codes.csv')
df_codes
| name | alpha-2 | alpha-3 | country-code | iso_3166-2 | region | sub-region | intermediate-region | region-code | sub-region-code | intermediate-region-code | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Afghanistan | AF | AFG | 4 | ISO 3166-2:AF | Asia | Southern Asia | NaN | 142.0 | 34.0 | NaN |
| 1 | Åland Islands | AX | ALA | 248 | ISO 3166-2:AX | Europe | Northern Europe | NaN | 150.0 | 154.0 | NaN |
| 2 | Albania | AL | ALB | 8 | ISO 3166-2:AL | Europe | Southern Europe | NaN | 150.0 | 39.0 | NaN |
| 3 | Algeria | DZ | DZA | 12 | ISO 3166-2:DZ | Africa | Northern Africa | NaN | 2.0 | 15.0 | NaN |
| 4 | American Samoa | AS | ASM | 16 | ISO 3166-2:AS | Oceania | Polynesia | NaN | 9.0 | 61.0 | NaN |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 244 | Wallis and Futuna | WF | WLF | 876 | ISO 3166-2:WF | Oceania | Polynesia | NaN | 9.0 | 61.0 | NaN |
| 245 | Western Sahara | EH | ESH | 732 | ISO 3166-2:EH | Africa | Northern Africa | NaN | 2.0 | 15.0 | NaN |
| 246 | Yemen | YE | YEM | 887 | ISO 3166-2:YE | Asia | Western Asia | NaN | 142.0 | 145.0 | NaN |
| 247 | Zambia | ZM | ZMB | 894 | ISO 3166-2:ZM | Africa | Sub-Saharan Africa | Eastern Africa | 2.0 | 202.0 | 14.0 |
| 248 | Zimbabwe | ZW | ZWE | 716 | ISO 3166-2:ZW | Africa | Sub-Saharan Africa | Eastern Africa | 2.0 | 202.0 | 14.0 |
249 rows × 11 columns
merged_df = pd.merge(df, df_codes[['alpha-2', 'alpha-3', 'region', 'sub-region']], left_on='Abbreviation', right_on='alpha-2', how='inner')
merged_df
| Country | Density | Abbreviation | Agricultural Land (%) | Land Area | Armed Forces size | Birth Rate | Calling Code | Capital/Major City | CO2 Emissions | ... | Tax revenue (%) | Total tax rate | Unemployment rate | Urban population | Latitude | Longitude | alpha-2 | alpha-3 | region | sub-region | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Afghanistan | 60.0 | AF | 58.1 | 652230.0 | 323000.0 | 32.49 | 93.0 | Kabul | 8672.0 | ... | 9.3 | 71.4 | 11.12 | 9797273.0 | 33.939110 | 67.709953 | AF | AFG | Asia | Southern Asia |
| 1 | Albania | 105.0 | AL | 43.1 | 28748.0 | 9000.0 | 11.78 | 355.0 | Tirana | 4536.0 | ... | 18.6 | 36.6 | 12.33 | 1747593.0 | 41.153332 | 20.168331 | AL | ALB | Europe | Southern Europe |
| 2 | Algeria | 18.0 | DZ | 17.4 | 2381741.0 | 317000.0 | 24.28 | 213.0 | Algiers | 150006.0 | ... | 37.2 | 66.1 | 11.70 | 31510100.0 | 28.033886 | 1.659626 | DZ | DZA | Africa | Northern Africa |
| 3 | Andorra | 164.0 | AD | 40.0 | 468.0 | NaN | 7.20 | 376.0 | Andorra la Vella | 469.0 | ... | NaN | NaN | NaN | 67873.0 | 42.506285 | 1.521801 | AD | AND | Europe | Southern Europe |
| 4 | Angola | 26.0 | AO | 47.5 | 1246700.0 | 117000.0 | 40.73 | 244.0 | Luanda | 34693.0 | ... | 9.2 | 49.1 | 6.89 | 21061025.0 | -11.202692 | 17.873887 | AO | AGO | Africa | Sub-Saharan Africa |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 190 | Venezuela | 32.0 | VE | 24.5 | 912050.0 | 343000.0 | 17.88 | 58.0 | Caracas | 164175.0 | ... | NaN | 73.3 | 8.80 | 25162368.0 | 6.423750 | -66.589730 | VE | VEN | Americas | Latin America and the Caribbean |
| 191 | Vietnam | 314.0 | VN | 39.3 | 331210.0 | 522000.0 | 16.75 | 84.0 | Hanoi | 192668.0 | ... | 19.1 | 37.6 | 2.01 | 35332140.0 | 14.058324 | 108.277199 | VN | VNM | Asia | South-eastern Asia |
| 192 | Yemen | 56.0 | YE | 44.6 | 527968.0 | 40000.0 | 30.45 | 967.0 | Sanaa | 10609.0 | ... | NaN | 26.6 | 12.91 | 10869523.0 | 15.552727 | 48.516388 | YE | YEM | Asia | Western Asia |
| 193 | Zambia | 25.0 | ZM | 32.1 | 752618.0 | 16000.0 | 36.19 | 260.0 | Lusaka | 5141.0 | ... | 16.2 | 15.6 | 11.43 | 7871713.0 | -13.133897 | 27.849332 | ZM | ZMB | Africa | Sub-Saharan Africa |
| 194 | Zimbabwe | 38.0 | ZW | 41.9 | 390757.0 | 51000.0 | 30.68 | 263.0 | Harare | 10983.0 | ... | 20.7 | 31.6 | 4.95 | 4717305.0 | -19.015438 | 29.154857 | ZW | ZWE | Africa | Sub-Saharan Africa |
195 rows × 39 columns
W szóstym kroku przeprowadzono tworzenie mapy Choropleth za pomocą biblioteki Plotly. Mapa ta pozwoli na wizualizację danych o populacji różnych państw na mapie świata.
Figure¶Na początku utworzono obiekt Figure za pomocą klasy go.Figure(), który posłuży do tworzenia wykresów w bibliotece Plotly.
Do obiektu Figure dodano mapę Choropleth za pomocą klasy go.Choropleth(). W mapie wykorzystano dane z DataFrame merged_df:
locations: Kolumna 'alpha-3' z DataFrame merged_df, która zawiera kody ISO 3-cyfrowe państw, służące do umiejscowienia danych na mapie.z: Kolumna 'Population' z DataFrame merged_df, która zawiera informacje o populacji poszczególnych państw, które będą reprezentowane na mapie.colorscale: Skala kolorów, w tym przypadku 'Reds', która określa odcienie czerwieni dla różnych wartości.text: Kolumna 'Country' z DataFrame merged_df, która dostarcza tekstowy opis państw, który będzie wyświetlany na mapie.colorbar_title: Tytuł dla legendy kolorów.Za pomocą fig.update_geos(projection_type='natural earth') ustawiono projekcję mapy na 'natural earth'. Ta opcja zapewnia odpowiedni wygląd mapy świata.
Za pomocą fig.update_layout() dokonano konfiguracji układu mapy. W tym przypadku ustawiono tytuł wykresu oraz określono wysokość i marginesy, aby dostosować prezentację mapy.
import plotly.graph_objects as go
import plotly.express as px
import json
import pandas as pd
import numpy as np
fig = go.Figure(
go.Choropleth(locations=merged_df['alpha-3'],
z=merged_df['Population'],
colorscale='Reds',
text = merged_df['Country'],
colorbar_title = 'Population',
marker_line_width=0.5
))
fig.update_geos(projection_type='natural earth')
fig.update_layout(title='<b>Countries by population.</b>',
height=300,
margin={"r":40,"t":40,"l":40,"b":0})
fig.show()
european_df = merged_df[merged_df['region'] == 'Europe'].copy()
fig = go.Figure(
go.Choropleth(locations=european_df['alpha-3'],
z=european_df['Population'],
colorscale='Reds',
reversescale=False,
text = european_df['Country'],
colorbar_title = 'Population',
marker_line_width=0.5
))
fig.update_geos(scope='europe',resolution=50)
fig.update_geos(projection_type='natural earth')
fig.update_layout(title='<b>Countries by population.</b>',
height=300,
margin={"r":40,"t":40,"l":40,"b":0})
fig.show()
asia_df = merged_df[merged_df['region'] == 'Asia'].copy()
fig = go.Figure(
go.Choropleth(locations = asia_df['alpha-3'],
z = asia_df['Population'],
colorscale = 'Reds',
reversescale = False,
text = asia_df['Country'],
colorbar_title = 'Population',
marker_line_width=0.5
))
fig.update_geos(scope='asia',resolution=50)
fig.update_geos(projection_type='natural earth')
fig.update_layout(title='<b>Countries by population.</b>',
height=300,
margin={"r":40,"t":40,"l":40,"b":0})
fig.show()
america_df = merged_df[merged_df['region'] == 'Americas'].copy()
fig = go.Figure(
go.Choropleth(locations = america_df['alpha-3'],
z = america_df['Population'],
colorscale = 'Reds',
reversescale = False,
text = america_df['Country'],
colorbar_title = 'Population',
marker_line_width=0.5
))
fig.update_geos(scope='north america',resolution=50)
fig.update_geos(projection_type='natural earth')
fig.update_layout(title='<b>Countries by population.</b>',
height=300,
margin={"r":40,"t":40,"l":40,"b":0})
fig.show()
merged_df['sub-region'].unique()
array(['Southern Asia', 'Southern Europe', 'Northern Africa',
'Sub-Saharan Africa', 'Latin America and the Caribbean',
'Western Asia', 'Australia and New Zealand', 'Western Europe',
'Eastern Europe', 'South-eastern Asia', 'Northern America',
'Eastern Asia', 'Northern Europe', 'Melanesia', 'Central Asia',
'Micronesia', 'Polynesia'], dtype=object)
south_america_df = merged_df[merged_df['sub-region'] == 'Latin America and the Caribbean'].copy()
fig = go.Figure(
go.Choropleth(locations = south_america_df['alpha-3'],
z = south_america_df['Population'],
colorscale = 'Reds',
reversescale = False,
text = south_america_df['Country'],
colorbar_title = 'Population',
marker_line_width=0.5
))
fig.update_geos(scope='south america',resolution=50)
fig.update_geos(projection_type='natural earth')
fig.update_layout(title='<b>Countries by population.</b>',
height=300,
margin={"r":40,"t":40,"l":40,"b":0})
fig.show()
W siódmym kroku wczytano dodatkowe dane zawierające szerokość i długość geograficzną stolic państw z pliku 'country_capitals.csv'. Następnie, połączono te dane z głównym DataFrame df za pomocą funkcji pd.merge(), tworząc merged_df_2, aby wzbogacić DataFrame o współrzędne geograficzne stolic państw.
Figure z Scattergeo¶Za pomocą klasy go.Figure(data=go.Scattergeo()) utworzono obiekt Figure z mapą Scattergeo, który posłuży do wyrysowania współrzędnych geograficznych stolic na mapie.
W obiekcie Figure użyto klasy go.Scattergeo() z danymi z DataFrame merged_df_2 do wyrysowania współrzędnych geograficznych stolic państw na mapie. Za pomocą parametrów lon i lat określono odpowiednio długość i szerokość geograficzną stolic. Dodatkowo, przy użyciu parametrów hovertext i customdata ustalono odpowiednie etykiety dla państw i ich stolic, które będą wyświetlane po najechaniu na punkty na mapie.
Za pomocą fig.update_geos() skonfigurowano wygląd mapy. W pierwszym przypadku użyto parametru scope='world', aby wyświetlić mapę całego świata. W drugim przypadku użyto parametru scope='europe', aby wyświetlić mapę wyłącznie Europy. Dodatkowo, użyto parametrów lonaxis_range, lataxis_range i center, aby skupić mapę na obszarze Europy i odpowiednio ją wyśrodkować.
Za pomocą fig.update_layout() ustawiono odpowiedni tytuł wykresu. Następnie za pomocą fig.show() wyświetlono mapę, która prezentuje stolice państw na mapie świata lub Europy w zależności od wybranej konfiguracji.
df_capitals = load_csv('country_capitals.csv')
df_capitals
| latitude | longitude | countryCode | continent | |
|---|---|---|---|---|
| 0 | -54.283333 | -36.500000 | GS | Antarctica |
| 1 | -49.350000 | 70.216667 | TF | Antarctica |
| 2 | 31.766667 | 35.233333 | PS | Asia |
| 3 | 60.116667 | 19.900000 | AX | Europe |
| 4 | -0.547700 | 166.920867 | NR | Australia |
| ... | ... | ... | ... | ... |
| 239 | 35.183333 | 33.366667 | NaN | Europe |
| 240 | 22.285000 | 114.158000 | HK | Asia |
| 241 | 0.000000 | 0.000000 | HM | Antarctica |
| 242 | -7.300000 | 72.400000 | IO | Africa |
| 243 | 0.000000 | 0.000000 | MO | Asia |
244 rows × 4 columns
merged_df_2 = pd.merge(df, df_capitals[['latitude', 'longitude', 'countryCode']], left_on='Abbreviation', right_on='countryCode', how='inner')
merged_df_2
| Country | Density | Abbreviation | Agricultural Land (%) | Land Area | Armed Forces size | Birth Rate | Calling Code | Capital/Major City | CO2 Emissions | ... | Population: Labor force participation (%) | Tax revenue (%) | Total tax rate | Unemployment rate | Urban population | Latitude | Longitude | latitude | longitude | countryCode | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Afghanistan | 60.0 | AF | 58.1 | 652230.0 | 323000.0 | 32.49 | 93.0 | Kabul | 8672.0 | ... | 48.9 | 9.3 | 71.4 | 11.12 | 9797273.0 | 33.939110 | 67.709953 | 34.516667 | 69.183333 | AF |
| 1 | Albania | 105.0 | AL | 43.1 | 28748.0 | 9000.0 | 11.78 | 355.0 | Tirana | 4536.0 | ... | 55.7 | 18.6 | 36.6 | 12.33 | 1747593.0 | 41.153332 | 20.168331 | 41.316667 | 19.816667 | AL |
| 2 | Algeria | 18.0 | DZ | 17.4 | 2381741.0 | 317000.0 | 24.28 | 213.0 | Algiers | 150006.0 | ... | 41.2 | 37.2 | 66.1 | 11.70 | 31510100.0 | 28.033886 | 1.659626 | 36.750000 | 3.050000 | DZ |
| 3 | Andorra | 164.0 | AD | 40.0 | 468.0 | NaN | 7.20 | 376.0 | Andorra la Vella | 469.0 | ... | NaN | NaN | NaN | NaN | 67873.0 | 42.506285 | 1.521801 | 42.500000 | 1.516667 | AD |
| 4 | Angola | 26.0 | AO | 47.5 | 1246700.0 | 117000.0 | 40.73 | 244.0 | Luanda | 34693.0 | ... | 77.5 | 9.2 | 49.1 | 6.89 | 21061025.0 | -11.202692 | 17.873887 | -8.833333 | 13.216667 | AO |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 192 | Venezuela | 32.0 | VE | 24.5 | 912050.0 | 343000.0 | 17.88 | 58.0 | Caracas | 164175.0 | ... | 59.7 | NaN | 73.3 | 8.80 | 25162368.0 | 6.423750 | -66.589730 | 10.483333 | -66.866667 | VE |
| 193 | Vietnam | 314.0 | VN | 39.3 | 331210.0 | 522000.0 | 16.75 | 84.0 | Hanoi | 192668.0 | ... | 77.4 | 19.1 | 37.6 | 2.01 | 35332140.0 | 14.058324 | 108.277199 | 21.033333 | 105.850000 | VN |
| 194 | Yemen | 56.0 | YE | 44.6 | 527968.0 | 40000.0 | 30.45 | 967.0 | Sanaa | 10609.0 | ... | 38.0 | NaN | 26.6 | 12.91 | 10869523.0 | 15.552727 | 48.516388 | 15.350000 | 44.200000 | YE |
| 195 | Zambia | 25.0 | ZM | 32.1 | 752618.0 | 16000.0 | 36.19 | 260.0 | Lusaka | 5141.0 | ... | 74.6 | 16.2 | 15.6 | 11.43 | 7871713.0 | -13.133897 | 27.849332 | -15.416667 | 28.283333 | ZM |
| 196 | Zimbabwe | 38.0 | ZW | 41.9 | 390757.0 | 51000.0 | 30.68 | 263.0 | Harare | 10983.0 | ... | 83.1 | 20.7 | 31.6 | 4.95 | 4717305.0 | -19.015438 | 29.154857 | -17.816667 | 31.033333 | ZW |
197 rows × 38 columns
fig = go.Figure(data=go.Scattergeo(
lon = merged_df_2['longitude'],
lat = merged_df_2['latitude'],
mode = 'markers',
name='',
customdata=merged_df_2['Capital/Major City'],
hovertext=merged_df_2['Country'],
hovertemplate='Country: %{hovertext}<br>Capital: %{customdata}',
marker = dict(
size = 5,
opacity = 0.8,
reversescale = True,
autocolorscale = False,
color='#fee08b',
symbol = 'circle',
line = dict(
width=1,
color='#000000'
),
)))
fig.update_geos(scope='world',
#lonaxis_range=[ -20.0, 37.0 ],
#lataxis_range=[ 30.0, 60.0 ],
#center={'lat': 51.919438, 'lon': 19.145136},
resolution=50,
landcolor='#f0f0f0',
countrycolor='#000000',
coastlinecolor='#000000')
fig.update_layout(title=dict(
text='<b>Capitals</b>',
xanchor='center',
x=.5),
margin={"r":0,"t":50,"l":0,"b":0},
)
fig.show()
W ósmym kroku wykluczono konkretne państwa spoza Europy, aby utworzyć mapę wyłącznie stolic państw europejskich. W tym celu utworzono listę excluded_countries zawierającą nazwy państw, które mają zostać pominięte na mapie. Następnie, użyto metody query() na DataFrame merged_df_2, aby wykluczyć państwa znajdujące się na liście excluded_countries. Wynik tego zapytania zapisano w filtered_merged_df.
Podobnie jak wcześniej, za pomocą klasy go.Figure(data=go.Scattergeo()) utworzono obiekt Figure z mapą Scattergeo, używając danych z filtered_merged_df do wyrysowania współrzędnych geograficznych stolic państw europejskich na mapie.
Reszta kodu jest analogiczna do poprzedniego, w tym ustawienie wyglądu mapy, tytułu i wyświetlenie mapy.
# Wyklucz konkretne państwa
excluded_countries = ["Morocco", "Algeria", "Tunisia", "Turkey", "Palestinian National Authority",
"Lebanon", "Syria", "Iraq", "Armenia", "Georgia", "Azerbaijan",
"Jordan", "Israel", "Namibia", "Eswatini"]
filtered_merged_df = merged_df_2.query("Country not in @excluded_countries").copy()
fig = go.Figure(data=go.Scattergeo(
lon = filtered_merged_df['longitude'],
lat = filtered_merged_df['latitude'],
mode = 'markers',
name='',
customdata=filtered_merged_df['Capital/Major City'],
hovertext=filtered_merged_df['Country'],
hovertemplate='Country: %{hovertext}<br>Capital: %{customdata}',
marker = dict(
size = 8,
opacity = 0.8,
reversescale = True,
autocolorscale = False,
color='#fee08b',
symbol = 'circle',
line = dict(
width=1,
color='#000000'
),
)))
fig.update_geos(scope='europe',
lonaxis_range=[ -20.0, 37.0 ],
lataxis_range=[ 30.0, 60.0 ],
center={'lat': 51.919438, 'lon': 19.145136},
resolution=50,
landcolor='#f0f0f0',
countrycolor='#000000',
coastlinecolor='#000000')
fig.update_layout(title=dict(
text='<b>Capitals of Europe</b>',
xanchor='center',
x=.5),
margin={"r":0,"t":50,"l":0,"b":0},
)
fig.show()
W dziewiątym kroku przeprowadzono tworzenie interaktywnego wykresu słupkowego dla 10 krajów, które emitują największą ilość CO2. Dane do tego wykresu pochodzą z DataFrame df, gdzie kolumna 'CO2 Emissions' zawiera informacje o emisji CO2 poszczególnych krajów.
Za pomocą df.nlargest(10, columns='CO2 Emissions') wybrano 10 krajów o największej emisji CO2 i utworzono DataFrame top_10_co2_emissions_df.
Za pomocą px.bar() z biblioteki Plotly Express utworzono wykres słupkowy fig_top_10_emissions. Wykres ten przedstawia 10 krajów z najwyższą emisją CO2 na osi X, a wartości emisji CO2 dla tych krajów na osi Y.
Ustawienie tytułu i etykiet
Za pomocą parametrów title i labels nadano odpowiednie tytuły wykresu i etykiety osi Y.
Wyświetlenie interaktywnego wykresu słupkowego
Za pomocą fig_top_10_emissions.show() wyświetlono interaktywny wykres słupkowy, który prezentuje 10 krajów o najwyższej emisji CO2. Wykres umożliwia interakcję użytkownika z danymi, dostępne jest przybliżenie i wyświetlenie dokładnych wartości po najechaniu kursorem.
import plotly.express as px
# Select the top 10 countries with highest CO2 emissions
top_10_co2_emissions_df = df.nlargest(10, columns='CO2 Emissions')
# Create the bar chart for the top 10 countries with highest CO2 Emissions
fig_top_10_emissions = px.bar(
top_10_co2_emissions_df,
x='Country',
y='CO2 Emissions',
title='Top 10 Countries with Highest CO2 Emissions',
labels={'CO2 Emissions': 'CO2 Emissions'},
)
# Show the interactive bar chart
fig_top_10_emissions.show()
W dziesiątym kroku obliczono emisję CO2 na mieszkańca dla wszystkich państw, korzystając z danych z DataFrame df. Do tego celu użyto kolumn 'CO2 Emissions' i 'Population', a wynik został zapisany w nowej kolumnie o nazwie 'CO2 Emissions per Population'.
Za pomocą df.nlargest(10, columns='CO2 Emissions per Population') wybrano 10 krajów o najwyższej emisji CO2 na mieszkańca i utworzono DataFrame top_10_co2_per_pop_df.
Następnie, za pomocą px.bar() z biblioteki Plotly Express utworzono wykres słupkowy fig_top_10, który przedstawia te 10 krajów na osi X i wartości emisji CO2 na mieszkańca na osi Y.
Ustawienie tytułu i etykiet dla wykresu
Za pomocą parametrów title i labels nadano odpowiednie tytuły wykresu i etykiety osi Y.
Za pomocą df.nsmallest(10, columns='CO2 Emissions per Population') powtórzono operacje, tym razem otrzymując 10 krajów o najniższej emisji CO2 na mieszkańca.
# Calculate CO2 Emissions per Population for all countries
df['CO2 Emissions per Population'] = df['CO2 Emissions'] / df['Population']
# Sort the DataFrame by CO2 Emissions per Population in descending order and select the top 10 countries
top_10_co2_per_pop_df = df.nlargest(10, columns='CO2 Emissions per Population')
fig_top_10 = px.bar(
top_10_co2_per_pop_df,
x='Country',
y='CO2 Emissions per Population',
title='Countries with Highest CO2 Emissions per Population',
labels={'CO2 Emissions per Population': 'CO2 Emissions per Population'},
)
# Sort the DataFrame by CO2 Emissions per Population in ascending order and select the bottom 10 countries
bottom_10_co2_per_pop_df = df.nsmallest(10, columns='CO2 Emissions per Population')
fig_bottom_10 = px.bar(
bottom_10_co2_per_pop_df,
x='Country',
y='CO2 Emissions per Population',
title='Countries with Lowest CO2 Emissions per Population',
labels={'CO2 Emissions per Population': 'CO2 Emissions per Population'},
)
# Show the interactive bar charts
fig_top_10.show()
fig_bottom_10.show()
W trakcie tego projektu zdobyłem różnorodne umiejętności techniczne w języku Python, które są kluczowe przy analizie danych i wizualizacji.
Nauczyłem się wczytywać dane z plików CSV do obiektów DataFrame przy użyciu biblioteki Pandas.
Zapoznałem się z operacją łączenia danych z różnych DataFrame'ów na podstawie wspólnych kluczy przy pomocy pd.merge(). Ta umiejętność była przydatna, gdy chciałem wzbogacić dane o dodatkowe informacje.
Zapoznałem się z różnymi operacjami manipulacji danymi w DataFrame, takimi jak dodawanie nowych kolumn, usuwanie niepotrzebnych kolumn, filtrowanie wierszy oraz zmiana typów danych kolumn. Dzięki temu byłem w stanie przygotować dane do analizy.
Dzięki bibliotece Plotly, nauczyłem się tworzyć interaktywne mapy Choropleth, które prezentują dane geograficzne w atrakcyjny sposób.
W ramach nauki biblioteki Plotly Express, zdobyłem umiejętność generowania wykresów słupkowych, które umożliwiają szybką i interaktywną wizualizację danych liczbowych.
Opanowałem tworzenie interaktywnych wykresów i map przy pomocy Plotly, które są użytecznym narzędziem do prezentacji danych w bardziej przystępny sposób. Te umiejętności pomogły mi tworzyć wizualizacje, które są atrakcyjne i zrozumiałe dla odbiorców.
Projekt dostarczył mi praktycznych umiejętności w analizie i wizualizacji danych w języku Python.